package db

import (
	"fmt"

	"gopkg.in/mgo.v2/bson"
)

//用objID查找
// func FindOne(objID string, col string) interface{} {

// 	session := NewSessionStore()
// 	defer session.Close()

// 	collection := session.C(col)

// 	entity := models.
// 	err := collection.FindId(objID).One(&entity)

// 	if err != nil {
// 		return nil
// 	}

// 	return entity

// }

// FindOne ...
// @Title
// @Description 查找一条记录
// @limitFields:限制要显示的fields
// @result传进来的是指针,用来接收结果
func FindOne(objID string, col string, limitFields map[string]int, result interface{}) {

	//要检查id格式是否24位,不然会导致转换崩溃
	// check := bson.IsObjectIdHex(objID)
	// if !check {
	// 	return
	// }
	// bid := bson.ObjectIdHex(objID)

	session := NewSessionStore()
	defer session.Close()

	collection := session.C(col)

	//err := collection.FindId(bid).One(result)

	if limitFields == nil {
		limitFields = map[string]int{"_id": 0}
	}

	err := collection.Find(bson.M{"id": objID}).Select(limitFields).One(result)
	if err != nil {
		fmt.Println("找不到该ID", objID)
	}

}

// FindOne ...
// @Title
// @Description 查找一条记录
// @queryMap 查询条件
// @limitFields:限制要显示的fields
// @result传进来的是指针,用来接收结果
func FindOneByCondition(queryMap map[string]interface{}, col string, limitFields map[string]int, result interface{}) {

	//要检查id格式是否24位,不然会导致转换崩溃
	// check := bson.IsObjectIdHex(objID)
	// if !check {
	// 	return
	// }
	// bid := bson.ObjectIdHex(objID)

	session := NewSessionStore()
	defer session.Close()

	collection := session.C(col)

	//err := collection.FindId(bid).One(result)

	if limitFields == nil {
		limitFields = map[string]int{"_id": 0}
	}

	err := collection.Find(queryMap).Select(limitFields).One(result)
	if err != nil {
		fmt.Println("找不到要搜索的资源")
	}

}

// FindAll ...
// @Title FindAll
// @Description 查找全部,返回条数
// @queryMap:查询条件 ,
// @limitFields:限制要显示的fields
// @sortKeys: 排序字段,
// @results:返回的指针数组,
// @needCount:是否需要计算总数目
func FindAll(col string, queryMap map[string]interface{}, limitFields map[string]int, sortKeys []string, results interface{}, limit int, needCount bool) int {

	session := NewSessionStore()
	defer session.Close()

	collection := session.C(col)

	count := 0
	// if queryMap == nil {
	// 	queryMap = bson.M{}
	// }
	query := collection.Find(queryMap)

	//限制显示字段
	if limitFields != nil {
		query.Select(limitFields)
	}

	//排序
	query.Sort(sortKeys...)

	//最多返回3000 , 多了请调用FindByPage()
	if limit == 0 || limit > 3000 {
		limit = 3000
	}

	_ = query.Limit(limit).All(results)
	//fmt.Println("err:", err)
	//需要计算总条数
	if needCount {
		count, _ = query.Count()
	}

	// var rrr map[string]interface{}
	// err = collection.Find(bson.M{"title": "title805"}).One(&rrr)
	// fmt.Println("单条:", rrr)
	return count
}

// FindByPage ...
// @Title 分页查找全部
// @page 要查找的页数(从1开始)
// @pagesize 每页限定条数
// @Description 分页查找全部,返回总条数
// @queryMap:查询条件 ,
// @limitFields:限制要显示的fields
// @sortKeys: 排序字段,
// @results:返回的指针数组,
// @needCount:是否需要计算总数目
func FindByPage(col string, page int, pagesize int, queryMap map[string]interface{}, limitFields map[string]int, sortKeys []string, results interface{}, needCount bool) int {

	session := NewSessionStore()
	defer session.Close()

	collection := session.C(col)

	// //(从1开始)
	// page = int(math.Max(1.0, float64(page)))
	// //每页最多显示200条
	// pagesize = int(math.Min(200.0, float64(pagesize)))
	skip := (page - 1) * pagesize

	//总条数
	count := 0
	// if queryMap == nil {
	// 	queryMap = bson.M{}
	// }
	//fmt.Println("查询:", queryMap)

	//多条件查询
	// queryMap = bson.M{"$or": []bson.M{bson.M{"title": bson.RegEx{"7", "."}},
	// 	bson.M{"content": bson.RegEx{"8", "."}}}}

	query := collection.Find(queryMap)

	//限制显示字段
	if limitFields != nil {
		query.Select(limitFields)
	}

	//排序
	query.Sort(sortKeys...)

	//需要计算总条数
	if needCount {
		count, _ = query.Count()
	}

	err := query.Limit(pagesize).Skip(skip).All(results)
	fmt.Println("err:", err)

	fmt.Printf("limit:%v , skip:%v,总数:%v \n", pagesize, skip, count)
	return count
}

// InsertOne 插入一条数据  entity为model对象
func InsertOne(entity interface{}, col string) bool {
	if entity == nil {
		return false
	}

	session := NewSessionStore()
	defer session.Close()

	collection := session.C(col)
	//可以插入多个 err := collection.Insert(&entity1,&entity2)

	err := collection.Insert(&entity)
	if err != nil {
		fmt.Println("插入失败")
		return false
	}

	//fmt.Println(entity)
	return true
}

// InsertBench 批量插入数据  entity为model对象
func InsertBench(entityArr []interface{}, col string) bool {
	if entityArr == nil {
		return false
	}

	session := NewSessionStore()
	defer session.Close()

	collection := session.C(col)
	//可以插入多个 err := collection.Insert(&entity1,&entity2)

	err := collection.Insert(entityArr...)
	if err != nil {
		fmt.Println("批量插入失败")
		return false
	}

	//fmt.Println(entity)
	return true
}

// UpdateOne 更新
func UpdateOne(objID string, col string, jsonMapdata map[string]interface{}) bool {

	// check := bson.IsObjectIdHex(objID)
	// if !check {
	// 	return false
	// }
	// bid := bson.ObjectIdHex(objID)

	session := NewSessionStore()
	defer session.Close()

	collection := session.C(col)

	// err := collection.UpdateId(bid, bson.M{"$set": jsonMapdata})
	err := collection.Update(bson.M{"id": objID}, bson.M{"$set": jsonMapdata})

	if err != nil {
		fmt.Println(err)
		return false
	}

	return true
}

// UpdateOne 根据自定义字段更新
func UpdateOneByLangkey(langkey string, col string, jsonMapdata map[string]string) bool {

	// check := bson.IsObjectIdHex(objID)
	// if !check {
	// 	return false
	// }
	// bid := bson.ObjectIdHex(objID)

	session := NewSessionStore()
	defer session.Close()

	collection := session.C(col)

	// err := collection.UpdateId(bid, bson.M{"$set": jsonMapdata})
	err := collection.Update(bson.M{"langkey": langkey}, bson.M{"$set": jsonMapdata})

	if err != nil {
		fmt.Println(err)
		return false
	}

	return true
}

// DeleteOne 删除资源
func DeleteOne(objID string, col string) bool {

	//要检查id格式是否24位,不然会导致转换崩溃
	// check := bson.IsObjectIdHex(objID)
	// if !check {
	// 	return false
	// }
	// bid := bson.ObjectIdHex(objID)

	session := NewSessionStore()
	defer session.Close()

	collection := session.C(col)

	// err := collection.RemoveId(bid)

	//不知道为什么不能转 bson.ObjectIdHex ,  注意:bson.D 不是 bson.M
	err := collection.Remove(bson.M{"id": objID})
	if err != nil {
		fmt.Println("删除找不到该ID:", objID)
		return false
	}

	return true
}

// DeleteAll 删除表的记录
func DeleteAll(col string) bool {

	//要检查id格式是否24位,不然会导致转换崩溃
	// check := bson.IsObjectIdHex(objID)
	// if !check {
	// 	return false
	// }
	// bid := bson.ObjectIdHex(objID)

	session := NewSessionStore()
	defer session.Close()

	collection := session.C(col)

	// err := collection.RemoveId(bid)
	_, err := collection.RemoveAll(nil)
	if err != nil {
		fmt.Println("清空失败")
		return false
	}

	return true
}
